package com.zpark.util;

import com.alibaba.fastjson.JSON;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;

/**
 * JWT令牌的签发与解析和验证
 */
public class JwtUtil<T> {

    // 配置密钥
    private static final String SECRET = "dsa4f5sd4f5ds4f56s4gsd11vx21gf23j_!@#$%^&";

    /**
     * 签发Token
     * @param data 需要存放到token当中的数据
     * @param <T> data的类型
     * @return token字符串
     */
    public static <T> String createToken(T data){
        // 使用JWT生成token
        // 创建JWT构建对象
        JWTCreator.Builder builder = JWT.create();
        // 设置JWT相关信息

        // 设置载荷数据
        // ....
        String json = JSON.toJSONString(data);
        builder.withClaim("user", json);

        // 设置jwt签发时间
        builder.withIssuedAt(new Date(System.currentTimeMillis()));
        // 设置jwt过期时间
        builder.withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 5));
        // 设置签发者
        builder.withIssuer("大锤");

        // 生成签名
        String jwt = builder.sign(Algorithm.HMAC256(SECRET));

        return jwt;
    }

    /**
     * 校验token并且返回解析token对象
     * @param token 令牌
     * @return DecodedJWT解析对象
     */
    public static DecodedJWT verifyToken(String token){
        // 获取token解析对象
        return JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
    }
}
